1

Object对象的方法

当Object 被作为工具方法,而不是构造方法时,

  • Object(arg):包装方法,将非对象类型包装成一个对象

  • Object.create(proto[, propertiesObject]):

  • Object.getPrototypeOf(obj):

Object实例对象的方法

必须区分“构造函数的方法”和“实例对象的方法”。

  • valueOf():返回当前对象对应的值。

  • toString():返回当前对象对应的字符串形式。
    这个方法很有用,可以用于判断对象类型

  • toLocalString():返回当前对象对应的本地字符串形式。

  • hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。

  • isPrototypeOf():判断当前对象是否为另一个对象的原型。

  • propertyIsEnumerable():判断某个属性是否可枚举。

对象的属性模型

  • Object.getOwnPropertyDescriptor():获取对象的属性的精确描述模型

Object.defineProperty()
Object.defineProperties()
这两个方法有性能损耗,会拖慢执行速度,不宜大量使用。

可枚举性(enumerable)

如果一个属性的enumerable为false,下面三个操作不会取到该属性。

for..in循环

Object.keys方法
JSON.stringify方法(有时可以利用这一点,为对象添加注释信息。)

因此,enumerable可以用来设置“秘密”属性。
遍历对象属性方法

  • Object.keys()

  • Object.getOwnPropertyNames()
    一般情况下,几乎总是使用Object.keys方法,遍历数组的属性。

存取器

var o ={
  $n : 5,
  get next(){return this.$n++ },
  set next(n) {
    if (n >= this.$n) this.$n = n;
    else throw "新的值必须大于当前值";
  }
};

o.next // 5

o.next = 10;
o.next // 10

利用存取器,可以实现数据对象与DOM对象的双向绑定。

对象拷贝

对于简单属性,就直接拷贝,对于那些通过描述对象设置的属性,则使用Object.defineProperty方法拷贝。

var extend = function (to, from) {
  var descriptor = Object.getOwnPropertyDescriptor(from, property);

  if (descriptor && ( !descriptor.writable
    || !descriptor.configurable
    || !descriptor.enumerable
    || descriptor.get
    || descriptor.set)) {
    Object.defineProperty(to, property, descriptor);
  } else {
    to[property] = from[property];
  }
}

控制对象状态

JavaScript提供了三种方法,精确控制一个对象的读写状态,防止对象被改变。最弱一层的保护是preventExtensions,其次是seal,最强的freeze。

不可扩展对象(不能加,可改,可删)

Object.preventExtensions方法可以使得一个对象无法再添加新的属性。可以用delete命令删除它的现有属性。
判断: Object.isExtensible(obj);

密封的对象(不能加,删,可改)

Object.seal方法使得一个对象既无法添加新属性,也无法删除旧属性。

判断: Object.isSealed(obj);

冻结的对象(不能加,不能改,不能删)

Object.freeze方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值,使得这个对象实际上变成了常量。
判断: Object.isFrozen(obj);

局限性: 需要注意的是,使用上面这些方法锁定对象的可写性,但是依然可以通过改变该对象的原型对象,来为它增加属性。


caicai
391 声望10 粉丝

精通Windows,Linux,Mac开关机...